package com.mcc.myapplication

// 在 Kotlin 中所有类都有一个共同的超类 Any，对于没有超类型声明的类它是默认超类
class Example : Any() // 从 Any 隐式继承

// 默认情况下，Kotlin 类是最终（final）的——它们不能被继承。 要使一个类可继承，请用 open 关键字
open class Base(p: Int) // 该类开放继承

class Derived(p: Int) : Base(p)

// 如果派生类没有主构造函数，那么每个次构造函数必须使用super 关键字初始化其基类型
class MyClass : Base {
    constructor(ctx: Int) : super(ctx)

    constructor(ctx: Int, name: String) : super(ctx)
}

// Kotlin 对于可覆盖的成员以及覆盖后的成员需要显式修饰符
open class Shape {
    open val vertexCount: Int = 0

    open fun draw() { /*……*/
    }

    // 如果函数没有标注 open 如 Shape.fill()，那么子类中不允许定义相同签名的函数
    fun fill() { /*……*/
    }
}

class Circle() : Shape() {
    override fun draw() { /*……*/
    }
}

// 将 open 修饰符添加到 final 类（即没有 open 的类） 的成员上不起作用

// 标记为 override 的成员本身是开放的，因此可以在子类中覆盖。如果你想禁止再次覆盖， 使用 final 关键字
open class Rectangle() : Shape() {

    // 属性与方法的覆盖机制相同。在超类中声明然后在派生类中重新声明的属性必须以 override 开头，并且它们必须具有兼容的类型。
    override val vertexCount = 4

    final override fun draw() { /*……*/
    }
}

interface Shape2 {
    val vertexCount: Int
}

class Rectangle2(override val vertexCount: Int = 4) : Shape2 // 总是有 4 个顶点

class Polygon2 : Shape2 {
    override var vertexCount: Int = 0  // 以后可以设置为任何数
}

// 派生类初始化顺序


// 调用超类实现


// 覆盖规则

fun main() {

}